Programmierung von CAx-Systemen

David Straub

CAx-Programmierung – D. Straub

Gliederung

  1. Einführung
  2. Topologie
  3. Geometrie
  4. Modellierungsstrategien
  5. Datenaustausch
  6. Simulation
  7. Optimierung
  8. Fertigung
CAx-Programmierung – D. Straub

Geometrie I: Kurven und Koordinatensysteme

  • Geometrie im B-Rep
  • Parametrische Darstellung
  • Koordinatensysteme und Transformationen
  • Analytische Kurven: Linie, Kreis, Ellipse
  • Beispiel: Versatz einer Kurve
CAx-Programmierung – D. Straub

Rückblick: Geometrie im B-Rep

CAx-Programmierung – D. Straub

Was steckt hinter einer Kante?

Letzte Vorlesung: das B-Rep-Gerüst

Solid → Shell → Face → Wire → Edge → Vertex

Topologie beschreibt die Struktur – aber noch nicht die Form.

Geometrie beantwortet: wo und wie liegt ein Element im Raum?

Topologieelement trägt als Geometrie
Vertex Punkt (x,y,z)(x,\, y,\, z)
Edge parametrische Kurve C(u)\mathbf{C}(u) + Parameterintervall [u1,u2][u_1, u_2]
Face parametrische Fläche S(u,v)\mathbf{S}(u,v) + Parameterbereich
CAx-Programmierung – D. Straub

Geometrie im B-Rep ablesen

geom_type verrät, welche Geometrie OCCT einem Element intern zuordnet:

Element geom_type charakteristische Größe
Kreiskante (Deckel/Boden) CIRCLE Radius, Mittelpunkt
Nahtkante (Mantellinie) LINE Richtungsvektor
Mantelfläche CYLINDER Achse, Radius
Deckel-/Bodenfläche PLANE Normalenvektor, Ursprung
zyl = bd.Cylinder(radius=10, height=20)
for e in zyl.edges():
    print(e.geom_type, round(e.length, 2))
# → CIRCLE 62.83  /  CIRCLE 62.83  /  LINE 20.0
CAx-Programmierung – D. Straub

Aufgabe 1: Geometrie im B-Rep ablesen

CAx-Programmierung – D. Straub

Startcode

import build123d as bd
from build123d import Axis, Plane, Location, Vector
CAx-Programmierung – D. Straub

1.1 – Zylinder analysieren

Erstellen Sie einen Zylinder (radius=15, height=30) und geben Sie aus:

  1. Für jede Fläche: geom_type und Flächeninhalt (area)
  2. Für jede Kante: geom_type und Länge (length)

Beantworten Sie:

  • Wie viele Kanten hat der Zylinder? Welche Geometrietypen kommen vor?
  • Welche Kante hat geom_type = LINE? Was stellt sie geometrisch dar?

Hinweise: .faces(), .edges(), .geom_type, .area, .length

CAx-Programmierung – D. Straub

1.2 – Vergleich mit anderen Körpern

Erstellen Sie einen Quader (Box(30, 20, 10)) und eine Kugel (Sphere(radius=10)).

  1. Welche geom_type-Werte kommen bei Flächen und Kanten vor?
  2. Warum hat die Kugel nur eine Fläche? Überprüfen Sie es.
  3. Vergleichen Sie mit dem Zylinder: Was haben alle drei gemein, was unterscheidet sie?

Hinweise: set(f.geom_type for f in ...), len(...)

CAx-Programmierung – D. Straub

1.3 – Kegel

Erstellen Sie einen Kegel:

kegel = bd.Cone(bottom_radius=20, top_radius=0, height=30)
  1. Welchen geom_type hat die Mantelfläche? Was erwarten Sie – und warum?
  2. Wie viele Kanten hat der Kegel? Welche Typen?
  3. Vergleichen Sie mit dem Zylinder: Was fehlt beim Kegel und warum?

Hinweise: .geom_type, .faces(), .edges()

CAx-Programmierung – D. Straub

Parametrische Darstellung

CAx-Programmierung – D. Straub

Drei Darstellungsformen

Wie lässt sich ein geometrisches Objekt mathematisch beschreiben?

Form Kreis (Beispiel) Problem
Explizit y=±R2x2y = \pm\sqrt{R^2 - x^2} mehrwertig; versagt bei senkrechter Tangente
Implizit x2+y2R2=0x^2 + y^2 - R^2 = 0 schwer auszuwerten; kein natürlicher Startpunkt
Parametrisch x=Rcosu,y=Rsinux = R\cos u,\quad y = R\sin u universell, eindeutig auswertbar

CAD-Systeme verwenden ausschließlich die parametrische Darstellung – für Kurven und Flächen.

CAx-Programmierung – D. Straub

Was kann man damit anstellen?

Eine parametrische Kurve erlaubt geometrische Anfragen, die mit einer bloßen Formel nicht möglich wären:

  • Punkt und Tangentenvektor bei beliebigem uu: C(u)\mathbf{C}(u), C(u)\mathbf{C}'(u)
  • Bogenlänge zwischen zwei Parameterwerten
  • Krümmung κ(u)\kappa(u)
  • Nächster Kurvenpunkt zu einem gegebenen Raumpunkt (Projektion)
e.position_at(0.5)   # Punkt bei t = 0.5
e.tangent_at(0.5)    # Tangentenvektor dort
e.length             # Gesamtlänge
CAx-Programmierung – D. Straub

Tangentenvektor

Eine Kurve im 3D-Raum als Funktion eines Parameters uu:

C(u)=(x(u)y(u)z(u)),u[umin,  umax]\mathbf{C}(u) = \begin{pmatrix} x(u) \\ y(u) \\ z(u) \end{pmatrix}, \qquad u \in [u_{\min},\; u_{\max}]

Der Tangentenvektor gibt Richtung und Geschwindigkeit entlang der Kurve an:

T(u)=C(u)=dCdu\mathbf{T}(u) = \mathbf{C}'(u) = \frac{d\mathbf{C}}{du}

  • Richtung: zeigt in die momentane Bewegungsrichtung
  • Länge T|\mathbf{T}|: „Geschwindigkeit“ im Parameterraum – hängt von der Parametrisierung ab
CAx-Programmierung – D. Straub

Bogenlänge

Die Bogenlänge ss misst die tatsächlich zurückgelegte Weglänge entlang der Kurve:

s(u)=u0uC(u~)du~,dsdu=C(u)s(u) = \int_{u_0}^{u} \bigl|\mathbf{C}'(\tilde{u})\bigr| \, d\tilde{u}, \qquad \frac{ds}{du} = |\mathbf{C}'(u)|

Bogenlängenparametrisierung (ss als Parameter):

dCds=1\left|\frac{d\mathbf{C}}{ds}\right| = 1

→ Tangentenvektor hat immer Länge 1

→ Geometrisch „natürliche“ Parametrisierung; rechnerisch aufwändig

CAx-Programmierung – D. Straub

Krümmung

Die Krümmung κ\kappa misst, wie stark sich die Tangentenrichtung mit der zurückgelegten Weglänge ändert:

κ=d2Cds2\kappa = \left|\frac{d^2\mathbf{C}}{ds^2}\right|

→ Bogenlängenparametrisierung

Für beliebige Parametrisierung (via Kettenregel + Lagrange-Identität):

κ(u)=C×CC3\kappa(u) = \frac{|\mathbf{C}' \times \mathbf{C}''|}{|\mathbf{C}'|^3}

  • κ=0\kappa = 0: Gerade \quad|\quad κ=1/R\kappa = 1/R: Kreis mit Radius RR
  • RK=1/κR_K = 1/\kappa: Krümmungsradius – Radius des anliegenden Kreises
CAx-Programmierung – D. Straub

Der Parameterraum

u:   0.0       0.25      0.5       0.75      1.0
     ●─────────●─────────●─────────●─────────●
     C(0)                C(½)               C(1)
  • Der Parameter läuft gleichmäßig von uminu_{\min} bis umaxu_{\max}
  • Die Punkte C(u)\mathbf{C}(u) im Raum sind dabei nicht gleichmäßig verteilt
  • Kreis: u[0,2π]u \in [0, 2\pi] – der Parameter entspricht dem Winkel

In build123d: position_at(t) mit t[0,1]t \in [0, 1] liefert den Punkt, tangent_at(t) den Tangentenvektor.

CAx-Programmierung – D. Straub

Parametrische Flächen

Flächen sind Funktionen von zwei Parametern uu und vv:

S(u,v)=(x(u,v)y(u,v)z(u,v)),u[u0,u1],v[v0,v1]\mathbf{S}(u, v) = \begin{pmatrix} x(u,v) \\ y(u,v) \\ z(u,v) \end{pmatrix}, \qquad u \in [u_0, u_1],\quad v \in [v_0, v_1]

Der Normalenvektor ergibt sich aus den Tangenten in uu- und vv-Richtung:

n(u,v)=Su×Sv\mathbf{n}(u,v) = \frac{\partial \mathbf{S}}{\partial u} \times \frac{\partial \mathbf{S}}{\partial v}

→ Vorzeichen bestimmt, welche Seite „außen“ ist (erinnert an Orientierung aus VL2)

Die Flächentypen (Ebene, Zylinder, NURBS-Flächen, …) sind Thema von Vorlesung 4.

CAx-Programmierung – D. Straub

Aufgabe 2: Parametrische Kurven erkunden

CAx-Programmierung – D. Straub

2.1 – Punkte auf einer Kreiskante

Nehmen Sie den Zylinder aus Aufgabe 1.1. Selektieren Sie eine Kreiskante und berechnen Sie position_at für t{0,0;  0,25;  0,5;  0,75}t \in \{0{,}0;\; 0{,}25;\; 0{,}5;\; 0{,}75\}.

  1. Auf welcher Höhe liegen die Punkte? Auf dem Deckel oder dem Boden?
  2. Berechnen Sie die Abstände zwischen aufeinanderfolgenden Punkten. Sind sie gleich?
  3. Erklärt das Ergebnis, warum der Parameter tt nicht dem Bogenmaß entspricht?

Hinweise: .filter_by(bd.GeomType.CIRCLE)[0], .position_at(t), (p2 - p1).length

CAx-Programmierung – D. Straub

2.2 – Tangente und Normalenrichtung

Berechnen Sie für dieselbe Kreiskante tangent_at(t) bei t{0,0;  0,25;  0,5;  0,75}t \in \{0{,}0;\; 0{,}25;\; 0{,}5;\; 0{,}75\}.

  1. In welche Richtung zeigt die Tangente bei t=0,0t = 0{,}0? Macht das geometrisch Sinn?
  2. Berechnen Sie den Radiusvektor (Richtung vom Kreismittelpunkt zum Punkt) und das Skalarprodukt mit der Tangente. Was ergibt sich – und warum?

Hinweise: .tangent_at(t), Vector(0, 0, z), .dot(), .normalized()

CAx-Programmierung – D. Straub

2.3 – Ellipse: gleichmäßiger Parameter, ungleichmäßige Punkte?

Erstellen Sie eine Ellipse und berechnen Sie 8 gleichmäßig verteilte Parameterpunkte:

ellipse = bd.Edge.make_ellipse(x_radius=30, y_radius=15)
punkte = [ellipse.position_at(i / 8) for i in range(8)]
  1. Berechnen Sie die Abstände zwischen aufeinanderfolgenden Punkten.
  2. Sind die Abstände gleichmäßig? Was sagt das über die Parametrisierung aus?
  3. Wo auf der Ellipse liegen die „dichteren" Punkte – bei großer oder kleiner Krümmung?

Hinweise: (p2 - p1).length, Folie „Parametrische Kurven"

CAx-Programmierung – D. Straub

Koordinatensysteme und Transformationen

CAx-Programmierung – D. Straub

Vektoren, Achsen, Ebenen

Drei Grundobjekte für die Arbeit im Raum:

Klasse Bedeutung Beispiel
Vector Punkt oder freier Vektor Vector(1, 2, 3)
Axis Ursprung + Richtung (Achse) Axis((0,0,0), (0,0,1))
Plane Ebene: Ursprung + Orientierung Plane.XY

Auf Vector sind die üblichen Operationen definiert: Addition, Skalierung, Länge (v.length), Normierung, Skalarprodukt (v.dot(w)), Kreuzprodukt (v.cross(w)).

CAx-Programmierung – D. Straub

Standardachsen und Standardebenen

Vordefinierte Achsen: Axis.X, Axis.Y, Axis.Z (Weltkoordinatensystem)

Vordefinierte Ebenen:

Ebene Normalenrichtung Verwendung
Plane.XY zz-Achse Standard-Skizzierebene
Plane.XZ yy-Achse Frontansicht
Plane.YZ xx-Achse Seitenansicht

Benutzerdefiniert:

  • Axis((5, 3, 0), (0, 0, 1)) – Achse durch beliebigen Punkt
  • Plane(origin=(0,0,10), z_dir=(1,0,0)) – Ebene mit beliebiger Normalen
CAx-Programmierung – D. Straub

Location: Lage eines Objekts im Raum

Jedes Objekt hat eine Location – seine Position und Orientierung im Weltkoordinatensystem.

Eine Location kodiert:

  • Translation: Verschiebung (dx,dy,dz)(dx,\, dy,\, dz)
  • Rotation: Orientierung (als Quaternion / Rotationsmatrix gespeichert)

Location ist das lokale Koordinatensystem eines Objekts relativ zur Welt.

Kann aus einem Punkt (Location((20, 10, 5))) oder aus einer Ebene (Location(Plane.XZ)) erzeugt werden.

CAx-Programmierung – D. Straub

Transformationen

Operation Methode
Verschiebung obj.move(Location((dx, dy, dz)))
Drehung obj.rotate(Axis.Z, winkel_grad)
Spiegelung obj.mirror(Plane.XZ)
Skalierung obj.scale(faktor)

Wichtig: Jede Transformation liefert ein neues Objekt – das Original bleibt unverändert.

Transformationen lassen sich verketten:
zyl.rotate(Axis.Z, 30).move(Location((20, 0, 0)))

CAx-Programmierung – D. Straub

Drehungen im Raum

Eine Drehung im 3D-Raum ist durch Achse + Winkel vollständig beschrieben:

Drehung=(e^,  φ)\text{Drehung} = \bigl(\hat{\mathbf{e}},\; \varphi\bigr)

  • e^\hat{\mathbf{e}}: Einheitsvektor der Drehachse (beliebig im Raum)
  • φ\varphi: Drehwinkel (im Uhrzeigersinn von oben, Rechte-Hand-Regel)

Intern wird daraus eine Rotationsmatrix RR3×3\mathbf{R} \in \mathbb{R}^{3\times 3} berechnet, die auf jeden Punkt angewendet wird: p=Rp\mathbf{p}' = \mathbf{R}\,\mathbf{p}

# Drehung um die Z-Achse, 45°
zyl.rotate(Axis.Z, 45)

# Drehung um eine beliebige Achse durch Punkt (5, 0, 0)
zyl.rotate(Axis((5, 0, 0), (0, 0, 1)), 30)
CAx-Programmierung – D. Straub

Reihenfolge von Transformationen

Translationen kommutieren – die Reihenfolge ist egal:

T1T2=T2T1\mathbf{T}_1\,\mathbf{T}_2 = \mathbf{T}_2\,\mathbf{T}_1

Rotationen kommutieren nicht – die Reihenfolge ist entscheidend:

RxRzRzRx\mathbf{R}_x\,\mathbf{R}_z \neq \mathbf{R}_z\,\mathbf{R}_x

Rotation + Translation kommutieren ebenfalls nicht:

TRRT\mathbf{T}\,\mathbf{R} \neq \mathbf{R}\,\mathbf{T}

→ Bei verketteten Transformationen immer auf die Reihenfolge achten.

CAx-Programmierung – D. Straub

Ebene aus einer Fläche

Ein besonders nützliches Muster: Konstruktionsebene direkt aus einer vorhandenen Fläche ableiten.

ebene = Plane(oberseite)   # Ursprung + Orientierung der Fläche

Die Ebene übernimmt automatisch den Flächenmittelpunkt als Ursprung und die Flächennormale als zz-Richtung.

Anwendung: Bohrung senkrecht auf einer schrägen Fläche – die Skizze wird auf der Fläche platziert, unabhängig von deren Lage im Raum.

CAx-Programmierung – D. Straub

Aufgabe 3: Transformationen

CAx-Programmierung – D. Straub

3.1 – Reihenfolge von Drehen und Verschieben

Erstellen Sie einen Zylinder (radius=10, height=20) und führen Sie die gleichen Operationen in unterschiedlicher Reihenfolge durch:

  • Variante A: 45° um die Z-Achse drehen, dann um (30,0,0)(30, 0, 0) verschieben
  • Variante B: um (30,0,0)(30, 0, 0) verschieben, dann 45° um die Z-Achse drehen
  1. Wo liegt der Mittelpunkt (center()) jeweils?
  2. Erklären Sie anhand der Formel TRRT\mathbf{T}\mathbf{R} \neq \mathbf{R}\mathbf{T} den Unterschied.

Hinweise: .rotate(Axis.Z, winkel), .move(Location((dx, dy, dz))), .center()

CAx-Programmierung – D. Straub

3.2 – Konstruktionsebene aus Fläche

Erstellen Sie einen Quader (Box(40, 30, 10)) und leiten Sie eine Konstruktionsebene von der Oberseite ab. Platzieren Sie darauf einen Zylinder (radius=8, height=15).

  1. Wo liegt der Ursprung der abgeleiteten Ebene?
  2. Verbinden Sie Quader und Zapfen. Wie viele Flächen hat der Gesamtkörper?
  3. Diskussion: Was wäre der Nachteil, wenn Sie statt Plane(oberseite) direkt Plane.XY.offset(5) verwendet hätten?

Hinweise: .faces().sort_by(Axis.Z).last, Plane(face), ebene * bd.Cylinder(...), + oder fuse

CAx-Programmierung – D. Straub

3.3 – Spiegelung

Bauen Sie eine asymmetrische Form aus zwei Quadern (sie sollen nicht spiegelsymmetrisch sein). Spiegeln Sie die Form an Plane.YZ und verbinden Sie Original und Spiegelbild.

  1. Überprüfen Sie, dass Original und Spiegelbild zusammen eine symmetrische Form ergeben.
  2. Welche Flächen „verschwinden" beim Verbinden?

Hinweise: .mirror(Plane.YZ), bd.Pos(x, y) * ..., +

CAx-Programmierung – D. Straub

Kurventypen

CAx-Programmierung – D. Straub

Analytische Kurven

Exakt durch eine geschlossene Formel beschreibbar:

Typ C(u)\mathbf{C}(u) geom_type Vorkommen
Linie A+ud\mathbf{A} + u\,\mathbf{d} LINE Kanten eines Quaders
Kreis M+R(cosu  e1+sinu  e2)\mathbf{M} + R\bigl(\cos u\;\mathbf{e}_1 + \sin u\;\mathbf{e}_2\bigr) CIRCLE Kanten eines Zylinders
Ellipse wie Kreis, aber RxRyR_x \neq R_y ELLIPSE Kegelschnitte

Für Standardkörper (Box, Cylinder, Sphere, …) reichen analytische Kurven vollständig aus.

CAx-Programmierung – D. Straub

Trimming: wie wird eine Kurve endlich?

Analytische Kurven sind mathematisch unbegrenzt – eine Linie reicht von -\infty bis ++\infty.

Eine Edge ist immer ein endliches Stück: Kurve + Parameterintervall [u1,u2][u_1,\, u_2]

Geom_Line (unendlich):   ────────────────────────────────
                                  ↑             ↑
                                 u₁            u₂
Edge (getrimmt):                  ●─────────────●

→ Dasselbe Kreisobjekt steckt hinter einem Halbkreis-Edge wie hinter einem Viertelkreis –
nur das Intervall [u1,u2][u_1, u_2] unterscheidet sie.

CAx-Programmierung – D. Straub

Ellipse: variable Krümmung

C(u)=(acosubsinu),κ(u)=ab(a2sin2u+b2cos2u)3/2\mathbf{C}(u) = \begin{pmatrix}a\cos u \\ b\sin u\end{pmatrix}, \qquad \kappa(u) = \frac{ab}{\bigl(a^2\sin^2 u + b^2\cos^2 u\bigr)^{3/2}}

An den vier Scheitelpunkten:

Stelle κ\kappa RK=1/κR_K = 1/\kappa
Ende der großen Halbachse (u=0°u = 0°) b/a2b/a^2 a2/ba^2/b (flach)
Ende der kleinen Halbachse (u=90°u = 90°) a/b2a/b^2 b2/ab^2/a (stark gebogen)

→ Die Ellipse hat keine konstante Krümmung – im Gegensatz zum Kreis, und das entscheidet, wie Operationen wie Versatz oder Abrundung auf sie wirken.

CAx-Programmierung – D. Straub

Beispiel: Versatz einer Kurve

CAx-Programmierung – D. Straub

Was ist ein Versatz (Offset)?

Eine Versatzkurve entsteht, indem jeder Punkt der Originalkurve um eine konstante Distanz dd entlang des Normalenvektors verschoben wird:

Coffset(u)=C(u)+dn^(u)\mathbf{C}_{\text{offset}}(u) = \mathbf{C}(u) + d \cdot \hat{\mathbf{n}}(u)

Typische CAD-Anwendungen:

  • Wanddicke bei Dünnwandteilen
  • Freiraum um ein Bauteil (Kollisionsprüfung)
  • Werkzeugpfad beim Fräsen
CAx-Programmierung – D. Straub

Versatz eines Kreises

Kreis (Radius RR): alle Normalen zeigen durch den Mittelpunkt → der Versatz verschiebt den Radius gleichmäßig.

Roffset=R+dR_{\text{offset}} = R + d

→ wieder ein Kreis!

Grund: Konstante Krümmung → Normalen drehen gleichmäßig → Versatz ändert nur den Radius.

CAx-Programmierung – D. Straub

Versatz einer Ellipse

Ellipse (a=30a = 30, b=15b = 15): Normalen drehen ungleichmäßig – die Krümmung variiert.

Die Versatzkurve lässt sich nicht als acosu,  bsinua'\cos u,\; b'\sin u schreiben:

ellipse = bd.Edge.make_ellipse(x_radius=30, y_radius=15)
offset  = ellipse.offset_2d(5)
for e in offset.edges():
    print(e.geom_type)   # → OFFSET

OCCT berechnet den Versatz numerisch als Offset-Kurve – keine analytische Ellipse mehr.

CAx-Programmierung – D. Straub

Warum ist die Versatzkurve keine Ellipse mehr?

Bei konstanter Krümmung (Kreis) wirkt der Versatz überall gleich.
Bei variabler Krümmung (Ellipse) wirkt er ungleichmäßig:

  • Stark gebogene Stellen (kleiner RKR_K): Versatz „staucht“ die Kurve
  • Flache Stellen (großer RKR_K): Versatz ändert die Form kaum

Geometrische Operationen erzeugen häufig Kurven höherer Komplexität als die Eingabe —
selbst bei einfachen Ausgangskurven.

Daher brauchen CAD-Systeme eine Darstellung, die beliebige glatte Kurven beschreiben kann.

CAx-Programmierung – D. Straub

Aufgabe 4: Versatzkurven

CAx-Programmierung – D. Straub

4.1 – Versatz eines Kreises

Erstellen Sie einen freistehenden Kreis und berechnen Sie den Versatz:

kreis = bd.Edge.make_circle(radius=20)
versatz = kreis.offset_2d(5)
  1. Welchen geom_type haben die resultierenden Kanten? Was bedeutet das geometrisch?
  2. Warum liefert offset_2d einen Wire (mehrere Kanten) statt einer einzelnen Kante?
  3. Wie groß ist der Radius der Versatz-Kanten? Berechnen Sie ihn aus der Länge.

Hinweise: .edges(), .geom_type, .length, r=l/(2π)r = l / (2\pi) (voller Kreis) oder r=l/πr = l / \pi (Halbkreis)

CAx-Programmierung – D. Straub

4.2 – Versatz einer Ellipse

Erstellen Sie eine Ellipse (x_radius=30, y_radius=15) und versetzen Sie sie um 5.

  1. Welchen geom_type haben die resultierenden Kanten? Unterschied zu 4.1?
  2. Warum ergibt der Versatz keine analytische Ellipse mehr? (Folie „Versatz einer Ellipse")
  3. Vergrößern Sie den Versatz auf 20. Was passiert und warum?

Hinweise: .offset_2d(d), .edges(), .geom_type

CAx-Programmierung – D. Straub

Zusammenfassung

  • Edge trägt eine Kurve C(u)\mathbf{C}(u), Face trägt eine Fläche S(u,v)\mathbf{S}(u,v)
  • Parametrische Darstellung: universell, eindeutig auswertbar
  • Tangente C(u)\mathbf{C}'(u) und Krümmung κ=1/RK\kappa = 1/R_K aus Ableitungen
  • Vector, Axis, Plane, Location – räumliches Handwerkszeug; Transformationen erzeugen neue Objekte
  • Analytische Kurven (Linie, Kreis, Ellipse): exakt, aber begrenzt
  • Geometrische Operationen erzeugen komplexere Geometrie: Versatz einer Ellipse → keine Ellipse mehr
CAx-Programmierung – D. Straub

Ausblick: Geometrie II

  • Freiformkurven: Bézier, B-Spline, NURBS
  • Stetigkeitsbedingungen: C0/C1/C2C^0 / C^1 / C^2 beim Verbinden von Kurven
  • Flächen: analytisch, Sweep-Flächen, NURBS-Flächen
  • Geometrische Anfragen: Projektion, Abstand, Schnittpunkte
CAx-Programmierung – D. Straub

Zusatzaufgabe: Lochkreis analysieren

CAx-Programmierung – D. Straub

Ringscheibe mit Bohrungen

Erstellen Sie eine Ringscheibe mit 6 Bohrungen auf einem Lochkreis:

import math

scheibe = bd.Cylinder(radius=40, height=8) - bd.Cylinder(radius=12, height=8)

for winkel in range(0, 360, 60):
    x = 28 * math.cos(math.radians(winkel))
    y = 28 * math.sin(math.radians(winkel))
    scheibe = scheibe - bd.Pos(x, y) * bd.Cylinder(radius=4, height=8)
CAx-Programmierung – D. Straub

Geometrieanalyse

  1. Wie viele Kanten hat die Scheibe? Welche Geometrietypen kommen vor und wie oft?
  2. Selektieren Sie alle Kreiskanten und bestimmen Sie die verschiedenen Radien. Welche Radien erwarten Sie – und passen sie zu den Konstruktionsmaßen?
  3. Verrunden Sie alle oberen Kreiskanten (Bohrungseintritt oben) mit radius=0.5.

Hinweise: collections.Counter, .filter_by(bd.GeomType.CIRCLE), .radius,
.filter_by_position(Axis.Z, minimum=..., maximum=...), bd.fillet(..., radius=...)

CAx-Programmierung – D. Straub